const express = require('express')
const bodyParser = require('body-parser')//用于解析请求体的中间件,否则无法获取req.body
const app = express()
const models = require('./db/models/index.js')
const baseUrl = '/todo_api'
const cors = require('cors')
const todoRouter = require('./router/index.js')

//1.cors插件处理跨域（推荐）
app.use(cors())
//2.自定义中间件处理跨域
/* let allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type, token');
    res.header('Access-Control-Allow-Credentials','true');
    next();
};
app.use(allowCrossDomain); */
//3.app.all('*')全局拦截处理跨域
/* app.all('*', (req, res, next)=>{
	res.header('Access-Control-Allow-Origin', '*');
	res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
	res.header('Access-Control-Allow-Headers', 'Content-Type, token');
	res.header('Access-Control-Allow-Credentials',true);
	console.log('res', res)
	next();
}) */


//使用bodyParser中间件解析请求体，必须在路由定义之前
app.use(bodyParser.urlencoded({ extended:  false  }))
app.use(bodyParser.json())
//加载路由
app.use(todoRouter)

//无法匹配上述所有路由时返回的默认数据(必须在路由定义之后使用，否则实际存在的api也会拦截提示不存在)
//和404中间件功能相同，二选一即可
/* app.all('*', (req, res)=>{
	res.json({
		name: '请求地址不存在'
	})
}) */

//自定义404中间件，express不会将404视为error
function handleNotFoundMidWare(req,res,next){
	res.json({
		message:'api不存在'
	})
}

//自定义异常处理中间件，所有的异常分支(catch)在此被捕获并返回错误状态码为500(必须在路由定义之后使用)
function handleErrMidWare (err, req, res, next) {
	if(err){
		console.log('err:', err)
		let {message} = res
		res.status(500).json({
			message
		})
	}
}

//404和异常处理的中间件放到最后
app.use(handleNotFoundMidWare)
app.use(handleErrMidWare)

//启动server
app.listen(3030, () => {
	console.log('todo-api-server start success 启动成功' + new Date())
})
